# ============================================================================
# 依赖管理模块
# ============================================================================
# 提供依赖关系管理和链接优化功能
# ============================================================================

# ============================================================================
# 公共核心库列表（供所有可执行文件使用）
# ============================================================================
# 这些是框架的核心库，大多数可执行文件都需要链接它们
# 使用公共变量可以避免重复定义，便于统一管理
# ============================================================================
set(NFSHM_CORE_LIBS
    NFPluginManager 
    NFPluginModule 
    NFObjCommon 
    NFCore 
    NFKernelMessage
    CACHE INTERNAL "NFShmXFrame 核心库列表（公共变量）"
)

# ============================================================================
# 根据编译选项条件添加第三方库到核心库或系统库列表
# ============================================================================
# NF3rdCommon 和 NFLuaBind 根据编译选项决定放在核心库还是系统库
# 如果编译，放在核心库；如果不编译，放在系统库（作为预编译库链接）
# 注意：需要先初始化空的 NFSHM_SYSTEM_LIBS，以便在 else 分支中使用
# ============================================================================
set(NFSHM_SYSTEM_LIBS "" CACHE INTERNAL "NFShmXFrame 系统库列表（公共变量）")

if(CMAKE_BUILD_NF3RDCOMMON)
    list(APPEND NFSHM_CORE_LIBS NF3rdCommon)
    set(NFSHM_CORE_LIBS ${NFSHM_CORE_LIBS} CACHE INTERNAL "NFShmXFrame 核心库列表（公共变量）" FORCE)
else()
	list(APPEND NFSHM_SYSTEM_LIBS NF3rdCommon)
	set(NFSHM_SYSTEM_LIBS ${NFSHM_SYSTEM_LIBS} CACHE INTERNAL "NFShmXFrame 系统库列表（公共变量）" FORCE)
endif()

if(CMAKE_BUILD_NFLUABIND)
    list(APPEND NFSHM_CORE_LIBS NFLuaBind)
    set(NFSHM_CORE_LIBS ${NFSHM_CORE_LIBS} CACHE INTERNAL "NFShmXFrame 核心库列表（公共变量）" FORCE)
else()
	list(APPEND NFSHM_SYSTEM_LIBS NFLuaBind)
	set(NFSHM_SYSTEM_LIBS ${NFSHM_SYSTEM_LIBS} CACHE INTERNAL "NFShmXFrame 系统库列表（公共变量）" FORCE)
endif()

# ============================================================================
# 公共系统库列表（供所有可执行文件使用）
# ============================================================================
# 这些是系统库和第三方库的公共部分，大多数可执行文件都需要链接它们
# 使用公共变量可以避免重复定义，便于统一管理
# 注意：此列表在条件判断之后初始化，确保 NF3rdCommon 和 NFLuaBind 已正确添加
# ============================================================================
if(UNIX)
list(APPEND NFSHM_SYSTEM_LIBS
    resolv
    dl
    rt
    pthread
    libtirpc.a
    libprotobuf.a
    libprotobuf-nanopb.a
	libgtest.a
)
elseif(WIN32)
list(APPEND NFSHM_SYSTEM_LIBS
	ws2_32.lib version.lib netapi32.lib Dbghelp.lib winmm.lib
	libprotobuf.lib protobuf-nanopb.lib gtest.lib
)
endif()
set(NFSHM_SYSTEM_LIBS ${NFSHM_SYSTEM_LIBS} CACHE INTERNAL "NFShmXFrame 系统库列表（公共变量）" FORCE)

# ============================================================================
# 公共框架插件列表（供所有静态链接的可执行文件使用）
# ============================================================================
# 这些是框架的核心插件，大多数静态链接的可执行文件都需要链接它们
# 使用公共变量可以避免重复定义，便于统一管理
# ============================================================================
set(NFSHM_FRAME_PLUGINS
    NFKernelPlugin
    NFNetPlugin
    NFShmPlugin
    NFMemPlugin
    NFDBPlugin
    NFTutorialPlugin
    NFTestPlugin
    CACHE INTERNAL "NFShmXFrame 框架插件列表（公共变量）"
)

# ============================================================================
# 公共服务器公共库列表（供服务器相关可执行文件使用）
# ============================================================================
# 这些是服务器的公共库，服务器相关的可执行文件（如 NFServerStatic, NFLieRenStatic）需要链接它们
# 使用公共变量可以避免重复定义，便于统一管理
# ============================================================================
set(NFSHM_SERVER_COMMON_LIBS
    NFServerMessage
    NFServerCommon
    CACHE INTERNAL "NFShmXFrame 服务器公共库列表（公共变量）"
)

# ============================================================================
# 公共服务器插件列表（供服务器相关可执行文件使用）
# ============================================================================
# 这些是服务器的核心插件，服务器相关的可执行文件（如 NFServerStatic, NFLieRenStatic）需要链接它们
# 使用公共变量可以避免重复定义，便于统一管理
# ============================================================================
set(NFSHM_SERVER_PLUGINS
    NFServerCommonPlugin
    NFDescStorePlugin
    NFCenterServerPlugin
    NFGameServerPlugin
    NFLogicServerPlugin
    NFLoginServerPlugin
    NFMasterServerPlugin
    NFProxyAgentServerPlugin
    NFProxyServerPlugin
    NFProxyClientPlugin
    NFRouteAgentServerPlugin
    NFRouteServerPlugin
    NFCityServerPlugin
    NFMatchServerPlugin
    NFNavMeshServerPlugin
    NFOnlineServerPlugin
    NFSnsServerPlugin
    NFStoreServerPlugin
    NFWebServerPlugin
    NFWorldServerPlugin
    NFLuaScriptPlugin
    CACHE INTERNAL "NFShmXFrame 服务器插件列表（公共变量）"
)

# ============================================================================
# 公共第三方库列表（供静态链接的可执行文件使用）
# ============================================================================
# 这些是第三方库的公共部分，静态链接的可执行文件（如 NFFrameStatic, NFServerStatic, NFLieRenStatic）需要链接它们
# 使用公共变量可以避免重复定义，便于统一管理
# ============================================================================
if(UNIX)

set(NFSHM_THIRD_PARTY_LIBS
    libtheron.a
    libmysqlpp.a
    libmysqlclient.a
    libevpp.a
    libevent_core.a
    libevent_openssl.a
    libevent_extra.a
    libevent.a
    libcurl.a
    libssl.a
    libcrypto.a
    libz.a
    libenet.a
	libcryptopp.a
    CACHE INTERNAL "NFShmXFrame 第三方库列表（公共变量）"
)

elseif(WIN32)
set(NFSHM_THIRD_PARTY_LIBS
		libcurl.lib
		event.lib
		event_core.lib
		Theron.lib
		mysqlclient.lib
		evpp.lib
		mysqlpp.lib
		Enet.lib
		libcryptopp.lib
	CACHE INTERNAL "NFShmXFrame 第三方库列表（公共变量）"
)
endif()

# 其他第三方库（sqlite3, nanopb）通常不需要添加到公共列表
# 因为它们只在特定模块中使用，不是所有可执行文件都需要

# 设置全局属性，确保可执行文件等待所有依赖库编译完成
set(CMAKE_LINK_DEPENDS_NO_SHARED ON CACHE BOOL "Don't link against shared libraries that haven't been built yet")

# 对于 Ninja 生成器，启用更严格的依赖检查
if(CMAKE_GENERATOR MATCHES "Ninja")
    message(STATUS "✅ Ninja 生成器：已启用严格的依赖检查")
endif()

# 设置链接器选项，确保等待所有输入文件
if(UNIX)
    # 对于静态库链接，确保所有库文件存在
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-as-needed" CACHE STRING "" FORCE)
endif()

message(STATUS "✅ 已启用链接依赖关系优化（确保库先编译后链接）")
message(STATUS "✅ 核心库列表: ${NFSHM_CORE_LIBS}")
message(STATUS "✅ 系统库列表: ${NFSHM_SYSTEM_LIBS}")
if(CMAKE_BUILD_NF3RDCOMMON OR CMAKE_BUILD_NFLUABIND)
    set(ENABLED_THIRD_PARTY_LIBS "")
    if(CMAKE_BUILD_NF3RDCOMMON)
        list(APPEND ENABLED_THIRD_PARTY_LIBS "NF3rdCommon")
    endif()
    if(CMAKE_BUILD_NFLUABIND)
        list(APPEND ENABLED_THIRD_PARTY_LIBS "NFLuaBind")
    endif()
    message(STATUS "   已启用的第三方库: ${ENABLED_THIRD_PARTY_LIBS}")
endif()

